package com.tp2.etna.distribucion2.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.tp2.etna.distribucion2.constante.ConstanteDist2;
import com.tp2.etna.distribucion2.modelo.Entrega;
import com.tp2.etna.distribucion2.modelo.EntregaDetalle;

@Repository
public class EntregaDist2DAOImpl implements EntregaDist2DAO {

	@Autowired
    private DataSource dataSource;
	
	//DIST2
		@Override
		public List<Entrega> listarPendientes(Date fecha) {
			List<Entrega> entregas = new ArrayList<Entrega>();
			String query = "select e.codigo, e.numero as numeroEntrega,c.nombre as cliente,mt.descripcion as motivoTranslado from Entrega e inner join EstadoEntrega ee"
					+ " on e.idEstadoEntrega = ee.codigo "
					+ " inner join MOTIVOTRASLADO mt"
					+ " on mt.codigo = e.idMotivoTraslado"
					+ " inner join CLIENTE c"
					+ " on c.codigo = e.idCliente"
					+ " where ee.abreviatura = ?"
					+ " and e.fechaEntrega = "
					+ (fecha == null ? " curdate()" : "?")       ;
	        Connection con = null;
	        PreparedStatement ps = null;
	        ResultSet rs = null;
	        try{
	            con = dataSource.getConnection();
	            ps = con.prepareStatement(query);
	            ps.setString(1, ConstanteDist2.ESTADO_ENTREGA_GENERADA);
	            if(fecha != null)
	            	ps.setDate(2, fecha);
	            rs = ps.executeQuery();
	            while(rs.next()){
	            	Entrega entrega = new Entrega();
	            	entrega.setCodigo(rs.getInt("codigo"));
	            	entrega.setNumero(rs.getString("numeroEntrega"));
	            	entrega.setClienteNombre(rs.getString("cliente"));
	            	entrega.setMotivoTranslado(rs.getString("motivoTranslado"));
	            	entregas.add(entrega);
	            }
	        }catch(SQLException e){
	            e.printStackTrace();
	        }finally{
	            try {
	                rs.close();
	                ps.close();
	                con.close();
	            } catch (SQLException e) {
	                e.printStackTrace();
	            }
	        }
	        return entregas;
		}

		@Override
		public Entrega getEntregaDist2ById(int id) {
	        Entrega entrega = null;
	        Connection con = null;
	        PreparedStatement ps = null;
	        ResultSet rs = null;
		        try{
		        //cabecera
	        	String query = "select "
	        			+ " e.codigo as codigo,"
				 		+ " e.numero as numeroeEntrega,"
				 		+ " c.nombre as cliente,"
				 		+ " c.aceptacion as aceptacion,"
				 		+ " mt.descripcion as motivoTraslado  "
				 		+ " from Entrega e"
	 					+ " inner join Cliente c"
	 					+ "	on e.idCliente = c.codigo"
	 					+ " inner join MotivoTraslado mt"
	 					+ " on mt.codigo = e.idMotivoTraslado"
	 					+ " where e.codigo = ?";

		            con = dataSource.getConnection();
		            ps = con.prepareStatement(query);
		            ps.setInt(1, id);
		            rs = ps.executeQuery();
		            if(rs.next()){
		            	entrega = new Entrega();
		            	entrega.setCodigo(rs.getInt("codigo"));
		            	entrega.setNumero(rs.getString("numeroeEntrega"));
		            	entrega.setClienteNombre(rs.getString("cliente"));
		            	entrega.setClienteAceptacion(rs.getDouble("aceptacion"));
		            	entrega.setMotivoTranslado(rs.getString("motivoTraslado"));
		            }else{
		                System.out.println(" Entrega no encontrada");
		            }
		          //detalle
		            
		            entrega.setDetalle(new ArrayList<EntregaDetalle>());
		            rs.close();
	                ps.close();
		            query = "select "
					 		+ " ed.codigo as codigoDetalle,"
		            		+ " p.codigo as codigoProd,"
					 		+ " p.nombre as nombreProducto,"
					 		+ " p.numero as numeroProducto,"
					 		+ " ed.cantidadEntregaProg as cantProg"
					 		+ " from EntregaDetalle ed"
		 					+ " inner join Producto p"
		 					+ " on ed.idProducto = p.codigo"	
		 					+ " where ed.idEntrega = ?"; 
		            ps = con.prepareStatement(query);
		            ps.setInt(1, id);
		            rs = ps.executeQuery();
		            while(rs.next()){
		            	EntregaDetalle entregaDetalle = new EntregaDetalle();
		            	entregaDetalle.setCodigo(rs.getInt("codigoDetalle"));
		            	entregaDetalle.setCantidadEntregaProg(rs.getInt("cantProg"));
		            	entregaDetalle.setCodigoProducto(rs.getInt("codigoProd"));
		            	entregaDetalle.setNombreProducto(rs.getString("nombreProducto"));
		            	entregaDetalle.setNumeroProducto(rs.getString("numeroProducto"));
		            	entrega.getDetalle().add(entregaDetalle);
		            }
		        }catch(SQLException e){
		            e.printStackTrace();
		        }finally{
		            try {
		                rs.close();
		                ps.close();
		                con.close();
		            } catch (SQLException e) {
		                e.printStackTrace();
		            }
		        }
		        return entrega;
		}

		@Override
		public boolean actualizarEstado(String estado,int id) {
			String query = "update Entrega set idEstadoEntrega = (select codigo from EstadoEntrega ee where ee.abreviatura = ?)"
					+ " where codigo = ?";
	        Connection con = null;
	        PreparedStatement ps = null;
	        try{
	            con = dataSource.getConnection();
	            ps = con.prepareStatement(query);
	            ps.setString(1, estado);
	            ps.setInt(2, id);
	            int out = ps.executeUpdate();
	            if(out !=0){
	            	return true;
	            }
	        }catch(SQLException e){
	            e.printStackTrace();
	        }finally{
	            try {
	                ps.close();
	                con.close();
	            } catch (SQLException e) {
	                e.printStackTrace();
	            }
	        }
	        return false;
		}

}
